도커를 사용하기 위해서는 우선 이미지(Image)와 컨테이너(container)의 개념을 알아야 한다.
도커 이미지는 가상 머신의 원본이 저장된 파일이라고 생각하면 이해하기 쉽다.
도커 이미지와 관련하여 많이 사용되는 명령어는 두 가지가 있다.
docker images
: 현재 도커 이미지 목록 출력docker rmi
: 도커 이미지 삭제우선 docker images
명령은 현재 파일 시스템에 저장된 도커 이미지 목록을 출력한다.
리눅스에서 도커를 사용하고 있다면 터미널을, 윈도우즈나 맥에서 도커 툴박스를 사용하고 있다면 Docker Quickstart Terminal을 시작한 후 다음과 같이 docker images
명령을 입력해 보자.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
datascienceschool/rpython latest 758190f70e5e 6 days ago 7.711 GB
ubuntu latest a1e4ed2ac65b 7 days ago 188 MB
현재 파일 시스템에 존재하는 모든 이미지의 목록을 보여준다. 여기에서 특정한 이미지를 지정하려면 첫번째 열의 REPOSITORY
와 TAG
를 콜론(:)으로 조합한 이미지 이름 문자열을 사용하든가 아니면 IMAGE ID열에 나타난 이미지 아이디를 사용해야 한다. 예를 들어 앞의 경우 datascienceschool/rpython:latest
이미지와 758190f70e5e
이미지는 같은 이미지를 가르킨다. 이미지 아이디를 사용하는 경우 중복된 아이디가 없다면 앞의 문자 일부분만 사용해도 된다. 예를 들어 758190f70e5e
대신 7581
을 사용할 수도 있다. (7581
로 시작하는 다른 아이디가 없는 경우)
만약 특정한 이미지를 삭제하고자 한다면 다음과 같이 docker rmi
뒤에 이미지 이름 문자열이나 이미지 아이디를 추가하여 입력한다.
$ docker rmi 758190f70e5e
만약 이미지를 삭제하려고 하는데 현재 해당 이미지를 복사한 컨테이너가 존재하거나 해당 이미지에 의존하는 다른 이미지가 존재하면 아래와 같이 오류 표시가 나타난다. 이 경우에는 해당 컨테이너 등을 삭제한 후 이미지를 삭제해야 한다.
$ docker rmi 758190f70e5e
Failed to remove image (758190f70e5e): Error response from daemon: conflict: unable to delete 758190f70e5e (must be forced) - image is being used by stopped container 3be34f7a1cb2
도커 컨테이너는 이미지를 메모리 상에 올린 것이라고 생각하면 된다. 따라서 하나의 이미지에서 복수개의 컨테이너를 가동해도 된다. 이 경우에는 완전히 동일한 가상 컴퓨터가 복수 대 있는 것과 마찬가지가 된다.
도커 컨테이너와 관련하여 많이 사용되는 명령어는 다음과 같다.
docker ps -a
: 현재 도커 컨테이너 목록 출력docker run
: 도커 컨테이너 가동docker attach
: 가동 중인 도커 컨테이너 안으로 들어가기exit
: 도커 컨테이너 중지 (컨테이너 내부에서)docker stop
: 도커 컨테이너 중지 (컨테이너 외부에서)docker rm
: 도커 컨테이너 삭제현재 존재하는 모든 도커 컨테이너 목록을 보려면 docker ps -a
명령을 사용한다. 만약 -a
옵션 없이 사용하면 가동중인 컨테이너만 보인다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3be34f7a1cb2 datascienceschool/rpython "/usr/bin/tini" 5 days ago Exited (137) 15 minutes ago 8787/tcp rpython
도커 이미지와 마찬가지로 도커 컨테이너도 NAMES
열에 보인 컨테이너 이름 문자열과 CONTAINER ID
열에 보인 컨테이너 아이디로 특정 컨테이너를 지정할 수 있다. 컨테이너를 멈추거나 삭제하는 경우에 사용한다.
도커 컨테이너를 시작하려면 docker run
명령을 사용한다. 이 명령에는 많은 옵션이 오게 되는데 대표적인 옵션은 다음과 같다.
-it
: 터미널을 가진 대화형으로 도커 컨테이너를 시작한다.-d
: 데몬(daemon)으로 도커 컨테이너를 시작한다.--name
: 컨테이너에 이름을 지정한다.-p
: 컨테이너와 호스트간의 포트 포워딩-v
: 컨테이너와 호스트간의 폴더 공유 옵션 다음에는 가동할 이미지의 이름과 수행할 명령을 추가한다.
예를 들어 datascienceschool/rpython
이미지를 대화형 컨테이너로 가동하는 경우 다음과 같이 입력할 수 있다.
docker run -it --name rpython -p 8888:8888 -p 8787:8787 datascienceschool/rpython
위 명령은 datascienceschool/rpython
이미지를 rpython
이란 컨테이너 이름으로 가동시키며 터미널을 가진 대화형 컨테이너를 사용하고 컨테이의 8888 포트와 8787포트를 호스트의 8888 포트 및 8787 포트와 연결하라는 의미이다.
원래 docker run
명령은 마지막에 /bin/bash
등의 명령을 주지만 datascienceschool/rpython
이미지의 경우 아무런 명령이 없을 경우 자동으로 /bin/bash
를 수행하도록 만들어져 있다. docker run
으로 /bin/bash
를 수행한 경우 다음과 같이 프롬프트가 바뀌며 도커 컨테이너 안으로 들어갔음을 보여준다.
$ docker run -it --name rpython -p 8888:8888 -p 8787:8787 datascienceschool/rpython
dockeruser@377ad03459bf:~$
앞의 프롬프트에서 dockeruser
는 도커 컨테이너상의 사용자 아이디를, 377ad03459bf
는 도커 컨테이너 아이디를 가리킨다.
도커 컨테이너 안에서 작업을 하다가 도커 컨테이너는 정지시키지 않고 잠시 컨테이너에서 호스트로 빠져나오고 싶은 경우에는 Ctrl+p, Ctrl+q 버튼을 누른다. (이 때 호스트 컴퓨터의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)
dockeruser@377ad03459bf:~$
Ctrl+p, Ctrl+q
user@user-PC MINGW64 ~
$
호스트 컴퓨터에서 작업을 끝낸 후 다시 빠져나왔던 도커 컨테이너로 들어가려면 docker attach
명령을 입력한다. 물론 명령어 뒤에 컨테이너 아이디나 이름을 인수로 입력해야 한다. (마찬가지로 컨테이너의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)
$ docker attach rpython
dockeruser@377ad03459bf:~$
만약 컨테이너 사용을 완전히 마치고 싶으면 컨테이너 안에서 exit
명령을 입력한다. 컨테이너를 중지하고 호스트 컴퓨터로 빠져나온다.
dockeruser@377ad03459bf:~$ exit
exit
user@user-PC MINGW64 ~
$
컨테이너를 중지하지 않고 빠져나온 경우에 외부에서 컨테이너를 중지하고 싶으면 docker stop
명령을 사용한다.
user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 15 seconds ago Up 5 seconds 0.0.0.0:8787->8787/tcp rpython
user@user-PC MINGW64 ~
$ docker stop rpython
rpython
user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 25 seconds ago Exited (143) 7 seconds ago rpython
컨테이너가 중지되었어도 컨테이너 자체는 계속 남아있기 때문에 같은 이름으로 컨테이너를 다시 생성하기 위해서는 해당 이름을 가진 컨테이너를 삭제해야 한다. 이 때 docker rm
명령을 사용한다.
user@user-PC MINGW64 ~
$ docker rm rpython
rpython
user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES